package nige.volum.core;

import java.util.Vector;

import nige.mesure.ecran.LogPrincipale;

/**
 * Classe permettant la recuperation des 
 * descriptions des langages
 * @author Nicolas Genevaux
 *
 */
public class Langage {

	/**
	 * Nom du langage
	 */
	private String langage = null;
	/**
	 * Liste des extensions a prendre 
	 * en compte
	 */
	private Vector<String> extension = null;
	/**
	 * Liste des caracteres a considerer 
	 * comme fin du code
	 */
	private Vector<String> endCodes = null;
	/**
	 * Chaine de caractere pour le debut 
	 * des commentaires
	 */
	private Vector<String> startComments = null;
	/**
	 * Chaine de caractere pour la fin 
	 * des commentaires
	 */
	private Vector<String> endComments = null;
	/**
	 * Nom special pour trouver des 
	 * objets speciaux (comme les classes)
	 */
	private Vector<String> specialName = null;
	/**
	 * Pattern correspondant au nom special
	 */
	private Vector<String> specialPatt = null;

	/**
	 * Premiere utilisation du set 
	 * (a utiliser avec Attribute2 et 3)
	 * @param la Nom du langage
	 * @param ext Vecteur des extenions
	 * @param endCodesT Vecteur fin de code
	 */
	public void setAttributes1(String la,
			Vector<String> ext,Vector<String> endCodesT) {
		langage = la;
		extension = ext;
		endCodes = endCodesT;
	}
	
	/**
	 * Deuxieme utilisation du set
	 * @param stC Start comment
	 * @param stE End comment 
	 * @param speN Vecteur contenant le 
	 * nom des speciaux
	 */
	public void setAttributes2(Vector<String> stC,
			Vector<String> stE,Vector<String> speN) {
		startComments = stC;
		endComments = stE;
		specialName = speN;
	}
	
	/**
	 * Troisieme utilisation du set
	 * @param speP Vecteur contenant 
	 * le pattern des objets speciaux
	 * @param resultExtensionT Resultat 
	 * sur les extensions
	 * @param resultLangageT Resultat 
	 * sur les langages
	 */
	public void setAttributes3(Vector<String> speP) {
		specialPatt = speP;
	}
	
	/**
	 * Verifie que le fichier correspond 
	 * au langage de la classe
	 * puis scan le fichier pour stocker 
	 * les resultats dans les vecteurs 
	 * de la classe
	 * @param fich Fichier a tester
	 * @return True si le fichier correspond
	 */
	public boolean scan(String fich) {
		// Scan d'un fichier
		// Verification que le fichier a la bonne
		// extension correspondant au langage et
		// demarrage du thread de scan
		if((fich.lastIndexOf(".")>=0) && 
				(extension.contains(
						fich.substring(
								fich.lastIndexOf(".")+1).
								toUpperCase()))) {
			ScanFile.scanner(fich,this);
			return true;
		}
		return false;
	}
	
	/**
	 * Verifie que la ligne transmise 
	 * est une ligne de code
	 * @param ligne Ligne de code 
	 * du fichier
	 * @return True si c'est une ligne
	 */
	public int nbInstruction(String ligne) {
		String ligneTmp = " "+ligne.toUpperCase()+" ";
		int total = 0;
		int endFor = endCodes.size();
		for(int i=0;i<endFor;i++) {
			try {
				total += ligneTmp.split(endCodes.get(i).toUpperCase()).length-1;
			}
			catch(Exception e) {
				LogPrincipale.add("LANGAGE.NBINSTRUCTION : "+e,2);
			}
		}
		total = (total<0)? 0 : total;
		return total;
	}

	/**
	 * Verifie que la ligne transmise 
	 * est une ligne de code
	 * @param ligne Ligne de code 
	 * du fichier
	 * @return True si c'est une ligne
	 */
	public boolean isCodeLine(String ligne) {
		int endFor = endCodes.size();
		for(int i=0;i<endFor;i++) {
			if(ligne.toUpperCase().
					indexOf(
							endCodes.get(i).
							toUpperCase())>=0) {
				return true;
			}
		}
		return false;
	}
	
	/**
	 * Verifie que la ligne 
	 * transmise est un commentaire
	 * @param ligne Ligne de code
	 * @return La fin du 
	 * commentaire si c'est un commentaire rien sinon
	 */
	public String isComment(String ligne) {
		int endFor = startComments.size();
		for(int i=0;i<endFor;i++) {
			if(ligne.toUpperCase().indexOf(
					startComments.get(i).
					toUpperCase())>=0) {
				return endComments.get(i);
			}
		}
		return "";
	}
	
	/**
	 * Verifie que la ligne contient 
	 * un objet special
	 * @param ligne Ligne de code
	 * @return Le nom de l'objet 
	 * special s'il y a un objet special, rien sinon
	 */
	public String isSpecial(String ligne) {
		int endFor = specialPatt.size();
		for(int i=0;i<endFor;i++) {
			if(ligne.toUpperCase().indexOf(
					specialPatt.get(i).
					toUpperCase())>=0) {
				return specialName.get(i);
			}
		}
		return "";
	}

	/**
	 * Retourne le nom du langage courant
	 * @return Le nom du langage
	 */
	public String getLangage() {
		return langage;
	}

	/**
	 * Retourne le vecteur des 
	 * extensions
	 * @return Un vecteur de 
	 * resultat des extensions
	 */
}
